package main

import (
	"fmt"
	"git-todo/tools"
	"os"
	"os/exec"
	"strconv"
	"strings"
)

// 打印代办内容
func EchoContent(content interface{}) {
	switch data := content.(type) {
	case []string:
		for v := range data {
			fmt.Println(v)
		}
	case map[string]string:
		for k, v := range data {
			fmt.Println(k, " "+v)
		}
	case map[int]string:
		for k, v := range data {
			fmt.Println(k, " "+v)
		}
	default:
		fmt.Println("不支持的 Data 类型")
	}
}

// 将返回类型为interface的数据转为map
func interfaceToMap(content interface{}) map[int]string {
	result := make(map[int]string)

	switch data := content.(type) {
	case map[int]string:
		for k, v := range data {
			result[k] = v
		}
	}

	return result
}

func testFile() {
	// var filePath string = "todolist.txt"
	// fmt.Println("文件名为：", filePath)

	//创建
	// res := tools.CreateFile(filePath, true)
	// fmt.Println(res.Status, res.Message)

	//追加
	// res2 := tools.AppendContentToFile("todolist.txt", "i want do job")
	// fmt.Println(res2, res2.Status, res2.Message)

	//读取
	// res3 := tools.ReadFile(filePath)
	// fmt.Println(res3)

	//覆盖写
	// data := make(map[int]string)
	// data[0] = "qq"
	// data[1] = "ww"
	// res4 := tools.TruncWriteFile(filePath, data)
	// fmt.Println(res4)
}

// 获取当前分支，如果error 为nil，则获取成功；否则失败
func getCurrentBranch() (string, error) {
	cmd := exec.Command("git", "rev-parse", "--abbrev-ref", "HEAD")
	output, err := cmd.Output()
	if err != nil {
		return "", err
	}
	return strings.TrimSpace(string(output)), nil
}

func main() {
	// fmt.Println("please implement it")

	args := os.Args
	len := len(args)

	//此处是参数校验
	var commandstr string = ""
	if len < 2 {
		commandstr = "list" //什么都不输入，则默认为list命令
	} else {
		commandstr = args[1]
	}

	var todoStr string = "" //待办名称
	//此处为了处理这种情况：直接输入 xxx 则等同于 add xxxx
	switch commandstr {
	case "list":
	case "add":
		//第0个是文件名，第2个是命令，第3个才是参数
		if len < 3 {
			// fmt.Println("请输入待办名称，args[2] 不存在")
			fmt.Println("请输入待办名称，args[2] 不存在")
			return
		}

		//拿到代办名称
		for i := 2; i < len; i++ {
			todoStr = todoStr + args[i] + " "
		}
	case "done":
		if len < 3 {
			fmt.Println("请输入待办序号，args[2] 不存在")
			return
		}
		todoStr = args[2] //待办字符串
	case "help":
	default:
		commandstr = "add"

		//不输入add，所以索引从1开始取值
		for i := 1; i < len; i++ {
			todoStr = todoStr + args[i] + " "
		}
	}

	//实现思路，为不同分支在.git文件夹下创建不同的代办文件，如todolist-master.txt ， todolist-develop.txt
	var filePath string = "todolist.txt"
	branch, err := getCurrentBranch()
	if err != nil {
		//获取分支名失败
		//说明是非git项目使用，则在当前目录下创建todolist.txt
	} else {
		//获取分支名成功
		filePath = ".git/todolist-" + branch + ".txt"
	}

	//根据命令不同，做不同的处理
	switch commandstr {
	case "list":
		response := tools.ReadFile(filePath)
		todolist := response.Data

		//打印代办
		EchoContent(todolist)
	case "add":
		tools.AppendContentToFile(filePath, todoStr)

		fmt.Println("Added it!")
	case "done":
		todoLine, err := strconv.Atoi(todoStr)
		if err != nil {
			fmt.Println("待办序号异常，请重新输入")
			return
		}

		response := tools.ReadFile(filePath)
		todolistTemp := response.Data //Date类型为interface，无法直接循环，所以需要转换成map
		todolist := interfaceToMap(todolistTemp)

		newFileContent := make(map[int]string) //代办文件的新内容
		newLine := 1                           //新的行号
		for k, v := range todolist {
			// fmt.Println(k, "-", v)
			//如果不等于命令行待办，则准备写回文件
			if todoLine != k {
				newFileContent[newLine] = v
				newLine++
			}
		}
		tools.TruncWriteFile(filePath, newFileContent)

		fmt.Println("DONE! Good Job!")
	case "help":
		fmt.Println("add: 添加任务")
		fmt.Println("list: 列出所有任务")
		fmt.Println("done: 完成任务")
		fmt.Println("help: 帮助")
	default:
		fmt.Println("命令：" + commandstr + " ，该命令不被识别，请重新尝试")
	}

}
